python packages创建 您所在的位置:网站首页 python 设置别名 python packages创建

python packages创建

2024-07-11 15:42| 来源: 网络整理| 查看: 265

我有一个目录,我们称之为存储装满了包含笨拙名字的包,比如mypackage-xxyyzzww,当然存储在我的PYTHONPATH上.由于包具有很长的不可知名称,因此所有包都符号链接到更友好的名称,例如mypackage.

现在,我不想依赖文件系统符号链接来执行此操作,而是尝试使用sys.path和sys.modules.目前我正在做这样的事情:

import imp

imp.load_package('mypackage', 'Storage/mypackage-xxyyzzww')

以这种方式做事有多糟糕,未来有可能会破裂吗?有趣的是,文档中甚至没有提到imp.load_package函数.

编辑:除了不依赖于符号链接,我不能再使用PYTHONPATH变量了.

解决方法:

importlib可能更合适,因为它使用/实现了PEP302机制.

按照DictImporter示例,但覆盖find_module以查找真实文件名并将其存储在dict中,然后重写load_module以从找到的文件中获取代码.

创建存储模块后,您不需要使用sys.path

#from importlib import abc

import imp

import os

import sys

import logging

logging.basicConfig(level=logging.DEBUG)

dprint = logging.debug

class MyImporter(object):

def __init__(self,path):

self.path=path

self.names = {}

def find_module(self,fullname,path=None):

dprint("find_module({fullname},{path})".format(**locals()))

ml = imp.find_module(fullname,path)

dprint(repr(ml))

raise ImportError

def load_module(self,fullname):

dprint("load_module({fullname})".format(**locals()))

return imp.load_module(fullname)

raise ImportError

def load_storage( path, modname=None ):

if modname is None:

modname = os.path.basename(path)

mod = imp.new_module(modname)

sys.modules[modname] = mod

assert mod.__name__== modname

mod.__path__=[path]

#sys.meta_path.append(MyImporter(path))

mod.__loader__= MyImporter(path)

return mod

if __name__=="__main__":

load_storage("arbitrary-path-to-code/Storage")

from Storage import plain

from Storage import mypkg

然后当你导入Storage.mypackage时,python会立即使用你的导入器而不必费心去查看sys.path

这不起作用.上面的代码可以在Storage下导入普通模块,而不需要存储在sys.path上,但3.1和2.6似乎都忽略了PEP302中提到的loader属性.

如果我取消注释sys.meta_path行,3.1使用StackOverflow消失,2.6使用ImportError消失.嗯…我现在没时间了,但可能会稍后再看.

标签:python

来源: https://codeday.me/bug/20190715/1472090.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有